往期精选
多线程设计模式—Read-Write Lock模式和Future模式分析
Nginx 实现防盗链及动静分离,Nginx keepalived 组合实现高可用配置详解
Java 一致性 Hash 算法在负载均衡中的应用,强烈推荐!
Java中Math.random()与Random类生成随机数及源码分析
深入理解 Spring AOP XML 配置方式实现原理源码剖析
点击上方蓝色“Java精选”,选择“设为星标”
技术文章第一时间送达!
作者:张丰哲https://www.jianshu.com/p/20b39ab6a88chttps://www.jianshu.com/p/34740cd1fb58
OK,博主就曾经被Maven“伤害”过,那么该专题的目的就是:彻底搞定Maven!
回想一下,当你新到一家公司,安装完JDK后就会安装配置Maven(MAVEN_HOME、path),很大可能性你需要修改settings.xml文件,比如你会修改本地仓库地址路径,比如你很可能会copy一段配置到你的settings.xml中(很可能就是私服的一些配置)。接下来,你会到IDEA或者Eclipse中进行Maven插件配置,然后你就可以在工程中的pom.xml里面开始添加<dependency>标签来管理jar包,在Maven规范的目录结构下进行编写代码,最后你会通过插件的方式来进行测试、打包(jar or war)、部署、运行。
上面描述了我们对Maven的一些使用方式,下面我们进行一些思考:
Q1:本地仓库?Maven到底有哪些仓库?它们什么关系?
http://repo1.maven.org/maven2/
Q2:关于<dependency>的使用
http://search.maven.org/
http://mvnrepository.com/
Maven,已经替我们想好了解决方案,就是使用Snapshot版本,在开发过程中B发布的版本标志为Snapshot版本,A进行依赖的时候选择Snapshot版本,那么每次B发布的话,会在私服仓库中,形成带有时间戳的Snapshot版本,而A构建的时候会自动下载B最新时间戳的Snapshot版本!
Q3:既然Maven进行了依赖管理,为什么还会出现依赖冲突?处理依赖冲突的手段是?
这里其实涉及到了2个概念:依赖传递(transitive)、Maven的最近依赖策略。
Maven的最近依赖策略:如果一个项目依赖相同的groupId、artifactId的多个版本,那么在依赖树(mvn dependency:tree)中离项目最近的那个版本将会被使用。(从这里可以看出Maven是不是有点小问题呢?能不能选择高版本的进行依赖么?据了解,Gradle就是version+策略)
现在,我们可以想想如何处理依赖冲突呢?
使用<dependency>
Q4:引入依赖的最佳实践,提前发现问题!
如果我们新加入一个依赖的话,那么先通过mvn dependency:tree命令形成依赖树,看看我们新加入的依赖,是否存在传递依赖,传递依赖中是否和依赖树中的版本存在冲突,如果存在多个版本冲突,利用上文的方式进行解决!
Q5:Maven规范化目录结构
第二:src/main/resources中的资源文件会COPY至目标目录,这是Maven的默认生命周期中的一个规定动作。(想一想,hibernate/mybatis的映射XML需要放入resources下,而不能在放在其他地方了)
Q6:Maven的生命周期
clean:有问题,多清理!
package:打成Jar or War包,会自动进行clean+compile
install:将本地工程Jar上传到本地仓库
deploy:上传到私服
Q7:关于scope依赖范围
compile:默认的scope,运行期有效,需要打入包中。
provided:编译期有效,运行期不需要提供,不会打入包中。
runtime:编译不需要,在运行期有效,需要导入包中。(接口与实现分离)
test:测试需要,不会打入包中。
system:非本地仓库引入、存在系统的某个路径下的jar。(一般不使用)
继承,在Java中就存在的概念,而且继承和多态往往密不可分。对于Maven而言,我们可以将一个大的复杂的项目,进行模块划分,这样各个模块各司其职,独立开发,这就涉及到继承与聚合了。
dao模块负责对DB的持久化操作,比如需要依赖mybatis,肯定也需要Spring来进行bean管理以及Mapper代理,也即是依赖mybatis+spring,注意mybatis的mapper文件以及spring的配置文件都放入到resources下。
service模块负责业务逻辑,需要依赖dao模块。由于依赖dao自然就引入了spring依赖,这里只需要加入事务的相关配置。
web模块负责前端交互,需要依赖service模块,以及spring-mvc。
在web模块中,除了需要加载web模块中的Spring配置文件外,显然也需要加载service/dao模块中的Spring配置文件,可是web模块依赖service,service依赖dao,也就是说最终web模块会依赖service.jar(spring配置文件在其中),dao.jar(spring配置文件在其中),因此我们需要加载service.jar、dao.jar中的spring配置文件!
留给你思考!_
Q10:私服 Nexus
第一:可以搜索依赖坐标得到XML片段;
第二:deploy 依赖到私服以及从私服下载依赖;
group:一个仓库组,说白了,就是几个仓库的集合。
hosted:宿主仓库,存储公司内部开发的jar,分为Releases/Snapshots。
proxy:用于代理中央仓库。
到这里,你应该能感觉到,在
settings.xml/pom.xml中进行私服配置的时候,
加入专业技术讨论企鹅群:248148860 ^^
往期精选
多线程设计模式—Read-Write Lock模式和Future模式分析
Nginx 实现防盗链及动静分离,Nginx keepalived 组合实现高可用配置详解
Java 一致性 Hash 算法在负载均衡中的应用,强烈推荐!
Java中Math.random()与Random类生成随机数及源码分析
深入理解 Spring AOP XML 配置方式实现原理源码剖析